/*
 * Implementacion de Automata Finito para reconocer los simbolos '+', '-', '*', ',', 
 * ';', '(', ')', '{', '}', '[', ']'.
 * 
 * Basado en el proyecto descrito en: 
 * Louden, K. (1997). Compiler Construction: Principles and Practice. Boston: PWS.
 * 
 * @ Project: Compiler
 * @ File Name: OperatorAutomaton.java
 */
package cml.scanning.automata;

import cml.TokenType;

public class OperatorAutomaton extends Automaton{
	
	private boolean done;
	
	/*
	 * Constructor de la clase.
	 */
	public OperatorAutomaton(){
		
		this.done = false;
		this.currentToken = null;
		this.tokenString = "";
		this.backtrack = false;
	}
	
	/*
	 * Ejecuta la siguiente transicion (si la hay) leyendo el caracter pasado 
	 * como parametro.
	 * 
	 * @param	char	el siguiente caracter a leer
	 * @return			<code>true</code> si ejecuto una transicion; 
	 * 					<code>false</code> en caso contrario
	 */
	public boolean nextStep(char c){
		
		done = true;
		
		switch(c){
			
			case '+':
				this.currentToken = TokenType.PLUS;
				break;
			case '-':
				this.currentToken = TokenType.MINUS;
				break;
			case '*': 
				this.currentToken = TokenType.TIMES;
				break;
			case ',':
				this.currentToken = TokenType.COMMA;
				break;
			case ';':
				this.currentToken = TokenType.SEMICOLON;
				break;
			case '(':
				this.currentToken = TokenType.LPAREN;
				break;
			case ')':
				this.currentToken = TokenType.RPAREN;
				break;
			case '[':
				this.currentToken = TokenType.LBRAK;
				break;
			case ']':
				this.currentToken = TokenType.RBRAK;
				break;
			case '{':
				this.currentToken = TokenType.LBRACE;
				break;
			case '}':
				this.currentToken = TokenType.RBRACE;
				break;
			default:{
				
				if(!Character.isWhitespace(c))
					this.currentToken = TokenType.ERROR; 
			}
		}
		
		tokenString = c + "";
		
		return true;
	}
	
	/*
	 * Reinicia al automata.
	 */
	@Override
	public void restart(){
		
		this.done = false;
		this.currentToken = null;
		this.tokenString = "";
	}
	
	/*
	 * Indica si el estado actual es el inicial.
	 * 
	 * @return	<code>true</code> si es el estado inicial;
	 * 			<code>false</code> en caso contrario
	 */
	@Override
	public boolean inStartState(){
		
		return !this.done;
	}
	
	/*
	 * Indica si el estado actual es de aceptacion.
	 * 
	 * @return	<code>true</code> si es estado de aceptacion;
	 * 			<code>false</code> en caso contrario
	 */
	@Override
	public boolean isDone(){
		
		return this.done;
	}
}
